package com.atguigu.bigdata.spark.core.acc;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.util.LongAccumulator;

import java.util.Arrays;

public class Spark02_Acc_JAVA {
    public static void main(String[] args) {
        /*
            累加器用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量，
            在Executor端的每个Task都会得到这个变量的一份新的副本，
            每个task更新这些副本的值后，传回Driver端进行merge。
         */

        // 1.创建配置对象
        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);
        LongAccumulator  sum = sc.sc().longAccumulator();
        JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1,2,3,4,5));

        rdd.foreach(new VoidFunction<Integer>() {
            @Override
            public void call(Integer integer) throws Exception {
                sum.add(integer);
            }
        });

        System.out.println(sum);

        sc.stop();
    }
}
